/**
 * 给定一个数组A（有负数），问有多少个非空区间累加和不小于K
 * 令S为A的前缀和，所以[i, j]区间满足条件等价于
 * Sj - S[i - 1] >= K
 * 等价于 Sj - K >= S[i - 1]
 * 维护一个二叉树，对每一个位置i：
 *    看比Si-K小的数一共有多少个，这就是以i结尾满足条件的区间的数量
 *    然后将Si加入二叉树
 * 可以使用树状数组，这里使用了支持排名的pbds二叉树
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using Real = long double;
using llt = long long;
using vi  =vector<int>;
using pii = pair<int, int>;
using vvi = vector<vi>;
using vpii = vector<pii>;

struct PBDS_BST{ // pbds的红黑树实现二叉排序树

using T = long long int;
using key_t = pair<T, int>; // 加时间戳，可以处理相同的键值
using value_t = int;

__gnu_pbds::tree<
    key_t, value_t, std::less<key_t>, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update
>shu;

/// 插入键值对，k是键，timestamp是时间戳
void insert(const T & k, int timestamp, const value_t & v = 0){
    this->shu.insert({{k, timestamp}, v});
}

/// 查询k在树中的排名，最小的数排名为1
/// k可以不存在于树中，此时为假设k在树中的排名
int rank(const T & k, int timestamp)const{
    auto ret = this->shu.order_of_key({k, timestamp});
    return ret + 1;
}

int size()const{return this->shu.size();}

}Tree;


int N;
vi A;
llt K;

llt proc(){
    Tree.insert(0, 0);
    llt ans = 0;
    llt s = 0;
    int k = 0;
    for(auto i : A){
        Tree.insert(s += i, ++k);
        llt tmp = s - K;
        int r = Tree.rank(tmp, N + N);
        ans += r - 1;
    }
    return ans;
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--){
        cin >> N >> K;
        A.assign(N, {});
        for(auto & i : A) cin >> i;
        cout << proc() << "\n";
    }
    return 0;
}